package com.example.mq.mqserver.core;

import java.io.Serializable;
import java.util.UUID;

/**
 * 表示一个消息
 */
public class Message implements Serializable {

    //用于标记当前的消息的版本号
    //提醒 代码 和 序列化的数据是否匹配.及时查看反序列化出的数据是否正确 --- 主要应对:序列化旧类型 --- 类型修改 ---- 反序列化到新类型上 的情况
    private static final long SerialVersionUID = 1l;

    private BasicProperties basicProperties =new BasicProperties();
    private byte[] body;

    //针对持久化保存的 偏移量
    //以下两者属性 当消息被保存在文件中时 就已经固定住了,所以不需要进行持久化保存
    //定义的目的就是为了让 内存中的 Message对象 快速定位 硬盘中的 Message 对象
    private transient long offsetBeg; //保存的消息头距离文件头的距离
    private transient long offsetEnd; //保存的消息尾举例文件头的距离

    //针对逻辑删除来说的 0x0:无效，0x1:有效
    private byte isValid = 0x1;

    //实现一个工厂方法 让工厂方法帮我们创建一个Message对象
    public static Message createMessageWithId (String routingKey,BasicProperties basicProperties,byte[] body){
        Message message =new Message();

        //BasicProperties 不为空的时候设置BasicProperties属性
        if(basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
        //设置 MessageId:使用UUID作为唯一的ID标识
        message.setMessageId(UUID.randomUUID().toString());
        // 覆盖 routingKey
        message.setRoutingKey(routingKey);
        message.body = body;
        return message;
    }

    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    public String getMessageId(){
        return basicProperties.getMessageId();
    }

    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }

    public void setDeliverMode(int mode){
        basicProperties.setDeliverMode(mode);
    }

    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }


    public BasicProperties getBasicProperties() {
        return basicProperties;
    }

    public void setBasicProperties(BasicProperties basicProperties) {
        this.basicProperties = basicProperties;
    }

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }

    public long getOffsetBeg() {
        return offsetBeg;
    }

    public void setOffsetBeg(long offsetBeg) {
        this.offsetBeg = offsetBeg;
    }

    public long getOffsetEnd() {
        return offsetEnd;
    }

    public void setOffsetEnd(long offsetEnd) {
        this.offsetEnd = offsetEnd;
    }

    public byte getIsValid() {
        return isValid;
    }

    public void setIsValid(byte isValid) {
        this.isValid = (byte) isValid;
    }
}
